終於到最後一天啦!我們寫的元件已經經過了Batch Size為1的測試,因為篇幅的關係所以沒有寫更完整的測試。但沒關係,今天就是用我們的元件展示各種情境,最後再做個總結
我沒有打算把插件安裝到GStreamer的預設目錄底下,所以我們要先設定環境變數讓GStreamer找得到這個插件,有顯示資訊的話就代表設定正確
export GST_PLUGIN_PATH="/ironman/sources/gst/colormagic/src"
gst-inspect-1.0 ironmancolormagic
export URI="file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.mp4"
gst-launch-1.0 nvurisrcbin uri=${URI} ! mux.sink_0 \
nvstreammux name=mux batch-size=1 width=1280 height=720 ! \
ironmancolormagic ! \
nvvideoconvert ! \
nvv4l2h264enc ! \
h264parse ! \
mp4mux ! \
filesink location="/ironman/colormagic_b1.mp4"

export URI="file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_720p.mp4"
gst-launch-1.0 nvurisrcbin uri=${URI} ! mux.sink_0 \
nvurisrcbin uri=${URI} ! mux.sink_1 \
nvurisrcbin uri=${URI} ! mux.sink_2 \
nvurisrcbin uri=${URI} ! mux.sink_3 \
nvstreammux name=mux batch-size=4 width=1280 height=720 ! \
ironmancolormagic ! \
nvmultistreamtiler rows=2 columns=2 ! \
nvvideoconvert ! \
nvv4l2h264enc ! \
h264parse ! \
mp4mux ! \
filesink location="/ironman/colormagic_b4.mp4"

可以看到我們寫的元件可以順利地完成預期的效果,而這就是深入了解DeepStream之後做出來的成果。我之所以會選擇呈現這樣的元件是因為它足以讓大家了解到如何從NvBufSurface和NvDsBatchMeta找到我們需要的資料,整個DeepStream也就是圍繞著這兩樣東西在操作。不選擇示範調用模型的原因是這份文章想要傳達的是通用的概念,我也不清楚大家實務上會用到什麼模型,也許nvinfer和nvinferserver就足以應付這些模型,而我就是因為實務上那兩個元件不能應付產品的需求,才要自己開發GStreamer插件搭配DeepStream使用
這邊就列出一些大家可以基於ironmancolormagic去進一步研究的方向
現在元件修改色彩的方式是寫死的,我們可以嘗試替它加上一些屬性,讓呼叫者可以去選擇不同的上色方式,比較容易的做法是練習定義GLib的Enum,讓呼叫者去選擇特定的上色方式
可以增加屬性讓呼叫者可以設定ROI,元件就只會修改ROI內的色彩。這個可以延伸一些應用,例如ROI內打碼,雖然9.1的nvdsosd就有內建,但也是一個嘗試方向
這個就更有挑戰性了,大家可以嘗試去篩選出特定物體的Bounding Box,然後只有在這些Bounding Box的範圍內上色,但是要記得考慮如果Bounding Box重疊的話,該怎麼應對這種情況
這次花了很大的篇幅希望能幫大家打好基礎,我也在這個過程中學到了之前工作中遺漏的知識。NVIDIA都希望用戶能夠直接將DeepStream設計好的應用跟模型佈署到正式產品,但多人的產品絕對不是像DeepStream說的那麼簡單,如果你有認真學著怎麼寫插件的話,我相信一定能幫助到你解決產品上的困境。
這整個系列的文章都是我事先設計好的,雖然有幾天因為需要篇幅稍微水了一點,但整個進度的安排算是相當順利,慶祝邊加班還要寫鐵人賽的日子終於結束啦!